package com.cl.code.database.mybatis;

import com.cl.code.database.mybatis.constant.CLMybatisConstants;
import com.cl.code.database.mybatis.module.page.PageParam;
import com.cl.code.database.mybatis.module.result.ListResultWrapper;
import com.cl.code.database.mybatis.module.result.PageResultWrapper;
import com.cl.code.database.mybatis.module.result.SingleResultWrapper;
import com.cl.code.database.mybatis.module.sql.Select;
import com.cl.code.database.mybatis.module.sql.View;
import com.cl.code.database.mybatis.module.sql.Where;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;

/**
 * @author chengliang
 * @since 1.0.0
 */
public interface FunctionMapper<Entity> {

    /**
     * 获取 Entity Class
     *
     * @return Entity Class
     */
    Class<Entity> getEntityClass();

    /**
     * 创建查询
     *
     * @return 查询
     */
    Select<Entity> createSelect();

    /**
     * 创建条件
     *
     * @return 条件
     */
    Where<Entity> createWhere();

    /**
     * 创建视图
     *
     * @return 视图
     */
    View<Entity> createView();

    /**
     * 列表
     *
     * @return 列表结果
     */
    ListResultWrapper<Entity> list();

    /**
     * 列表
     *
     * @param select 搜索
     * @return 列表结果
     */
    ListResultWrapper<Entity> list(Select<Entity> select);

    /**
     * 分页
     *
     * @param select     搜索
     * @param pageNumber 页码
     * @param pageSize   每页大小
     * @return 分页结果
     */
    PageResultWrapper<Entity> page(Select<Entity> select, int pageNumber, int pageSize);

    /**
     * 分页
     *
     * @param select    搜索
     * @param pageParam 分页参数
     * @return 分页结果
     */
    PageResultWrapper<Entity> page(Select<Entity> select, PageParam pageParam);

    /**
     * 单例
     *
     * @param id 主键
     * @return 单例结果
     */
    SingleResultWrapper<Entity> single(Serializable id);

    /**
     * 单例
     *
     * @param select 搜索
     * @return 单例结果
     */
    SingleResultWrapper<Entity> single(Select<Entity> select);

    /**
     * 统计
     *
     * @return 统计
     */
    int count();

    /**
     * 插入
     *
     * @param entity 实体
     * @return 影响行数
     */
    int insert(@Param(CLMybatisConstants.ENTITY_NAME) Entity entity);

    /**
     * 批量插入
     *
     * @param entityList 实体列表
     * @return 影响行数
     */
    int insertBatch(Collection<Entity> entityList);

    /**
     * 通过ID更新
     *
     * @param entity 实体
     * @return 影响行数
     */
    int updateById(Entity entity);

    /**
     * 通过ID更新（忽略空值）
     *
     * @param entity 实体
     * @return 影响行数
     */
    int updateByIdSelective(Entity entity);

    /**
     * 通过ID删除
     *
     * @param id 主键
     * @return 影响行数
     */
    int deleteById(Serializable id);

    /**
     * 通过ID批量删除
     *
     * @param ids 主键列表
     * @return 影响行数
     */
    int deleteByIds(Collection<Serializable> ids);

    /**
     * 通过ID逻辑删除
     *
     * @param id 主键
     * @return 影响行数
     */
    int logicDeleteById(Serializable id);

    /**
     * 通过ID逻辑删除
     *
     * @param ids 主键
     * @return 影响行数
     */
    int logicDeleteByIds(Collection<Serializable> ids);


}
